package com.yanggu.scala.chapater10

import scala.collection.mutable

object MapDemo02 {

  def main(args: Array[String]): Unit = {
    //1. 方式1-构造不可变map。默认是有序的
    val map = Map[String, Int]("Alice" -> 10, "Blob" -> 20, "Java" -> 30)
    println(map)

    //2. 方式2-构造可变的map。底层是HashMap, 默认是无序的
    val map2 = mutable.Map[String, Int]("Alice" -> 10, "Blob" -> 20, "Java" -> 30)
    println(map2)

    //3. 方式3-创建空的map
    val map3 = new mutable.HashMap[String, Int]
    println(map3)

    //4. 方式4-对偶元祖
    val map4 = mutable.Map[String, Int](("Alice", 10), ("Bob", 20), ("Java", 30))
    println(map4)

    println("==============map的取值方式==============")
    //1. map的取值方式
    val value = map2("Alice")
    println(value)
    //如果不存在对应的value。则会跑出异常
    //val value2 = map2("wangwu")

    //2. 使用contains(key)检查是否存在key。然后取出value的方式
    if (map2.contains("wangwu")) {
      println(map2("wangwu"))
    } else {
      println("没有wangwu对应的key和value")
    }

    //3. 使用map.get(key).get的方式取值
    //如果有值，就返回。没有值就会抛出异常
    //val value1 = map2.get("wangwu").get
    //println(value1)

    //4. 添加元素
    println("****************添加元素*******************")
    //map("Scala") = 30 对于不可变的Map。不能新添加元素。编译器直接报错
    println(map2.hashCode())
    map2("Scala") = 30
    //如果存在对应的key就进行修改。如果不存在就添加
    map2("Java") = 50
    println(map2)
    println(map2.hashCode())
    //添加多个元素
    map2 += ("EE" -> 1, "FF" -> 3)
    println(map2)

    //5. 删除元素
    //删除元素时直接通过key删除、如果key不存在也不会报错
    map2 -= ("Scala", "B", "EE", "FF")
    map2.remove("Blob")
    println(map2)

    //6. map的遍历
    //map的遍历有很多种方式。k-v方式、元祖方式、根据key获取value
    println("**************map的遍历***************")
    val map5 = mutable.Map[String, Int](("A", 1), ("b", 2), ("c", 3))
    //元祖方式
    for (elem <- map5) {
      println(elem._1 + "->" + elem._2)
    }
    //k-v方式
    for ((k, v) <- map5) {
      println(k + "->" + v)
    }
    //根据key获取value
    for (k <- map5.keys) {
      println(k + "->" + map5(k))
    }

    //7. 合并两个map
    println("*********合并两个map**********")
    val map6 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5)
    val map7 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10)
    val mapAdd1 = map6 ++ map6.map(t => t._1 -> (t._2 + map7.getOrElse(t._1, 0)))
    println(mapAdd1)
  }

}
